﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biciq.Logica;
using Biciq.Datos;

namespace Biciq.Logica
{
    public class SecurityService :IDisposable
    {
        private Result result = new Result();
        public Biciq.Datos.Usuario user { get; set; }
        public Result Login(string userName, string password)
        {
            try
            {
                using (BiciqContexto  context = new BiciqContexto())
                {

                    var user = context.Usuarios
                        .Where(u => u.nombreUsuario == userName && u.clave == password && u.estado == "ACT" )
                        .FirstOrDefault();

                    if (user == null)
                    {
                        result.mensaje = "El Nombre de usuario o clave ingresados son incorrectos, intente nuevamente";
                        result.estado = false;
                        return result;
                    }
                    this.user = user;

                }
            }
            catch (Exception ex)
            {
                result.mensaje = "Error desconocido al intentar logearse: " + ex.Message;
                result.estado = false;

            }
            result.mensaje = "OK";
            result.estado =true;
            return result;
        }

      

        public void Dispose()
        {
            
        }

       
      

      /// <summary>
      /// Metodo utilizado para la creación de usuarios en el sistema.
      /// </summary>
      /// <param name="user">nick del usuarios</param>
      /// <returns></returns>
        public Result createUser(Biciq.Datos.Usuario user)
        {
            result.mensaje = "Ok";
            result.estado = true;
            using (BiciqContexto context = new BiciqContexto())
            {
                try
                {
                  
                    context.Usuarios.AddObject(user);
                    context.SaveChanges();

                    
                }
                catch (Exception ex)
                {

                    result.mensaje = ex.Message;
                    result.estado= false;
                }
            }
            return result;
        }

      

        /// <summary>
        /// Metodo utilizado para definir el nombre del usuario del sistema 
        /// </summary>
        /// <param name="userName">Nombre de usuario "nick"</param>
        /// <returns></returns>
        public Biciq.Datos.Usuario getUserByName(string userName)
        {
            using (BiciqContexto context = new BiciqContexto())
            {
                return context.Usuarios
                       .Include("Rol")
                        .Include("Rol.Accesoes")
                    .Where(u => u.nombreUsuario == userName).FirstOrDefault();

            }
        }
        
        /// <summary>
        /// Metodo utilizado para definir el email del usuario del sistema
        /// </summary>
        /// <param name="email">Correo del usuario del sistema</param>
        /// <returns></returns>
        public Biciq.Datos.Usuario getUserByEmail(string email)
        {
            using (BiciqContexto context = new BiciqContexto())
            {
                
                   return context.Usuarios
                    .Include("Rol")
                    .Include("Rol.Accesoes")
                    .Where(u => u.email == email).FirstOrDefault();

            }
        }
        /// <summary>
        /// Metodo utilizado para cambiar la contraseña del usuario del sistema
        /// </summary>
        /// <param name="userName">NICK de sistema</param>
        /// <param name="oldPassword">Antigua contraseña</param>
        /// <param name="newPassword">Nueva contraseña</param>
        /// <returns></returns>
        public Result changePassword(String userName, string oldPassword, string newPassword)
        {
            Result result = new Result();
            result = this.Login(userName.ToUpper(),Comun.encript(oldPassword));
            if (result.estado)
            {
                result = this.changePassword(userName.ToUpper(), Comun.encript(newPassword));
            }
            else
            {
                result.estado = false;
                result.mensaje = "El password anterior en inválido";
            }
            return result;
        }

        /// <summary>
        /// Metodo utilizado para el cambio de contraseña 
        /// </summary>
        /// <param name="userName">NICK de usuario</param>
        /// <param name="newPassword">Nueva contraseña</param>
        /// <returns></returns>
        public Result changePassword(String  userName, string newPassword)
        {
            Result result = new Result();
            result.estado = true;
            try
            {
                using (BiciqContexto contexto = new BiciqContexto())
                {
                    var usuario = contexto.Usuarios.Where(u => u.nombreUsuario == userName && u.estado == "ACT").FirstOrDefault();
                    usuario.clave = newPassword;
                    usuario.primerIngreso = false;
                    contexto.SaveChanges();
                }


            }
            catch (Exception)
            {

                result.estado = false;
            }
            return result;
        }

        /// <summary>
        /// Metodo para acceder a los datos acorde al usuario a ingresar.
        /// </summary>
        /// <param name="usuario">Distinción del usuario</param>
        /// <returns></returns>
        public List<Biciq.Datos.Recurso> traerRecursosUsuario(Biciq.Datos.Usuario usuario)
        {
            using (BiciqContexto context = new BiciqContexto())
            {
                var x = (from a in context.Accesoes.Where(a => a.idRol == usuario.idRol)
                         select a.Recurso).ToList();


                return x;
            }
        }
      
    }
}
